package com.zyf.concurrency.chapter13;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 可中断的锁获取操作
 * 引自原文：
 *      可中断的锁获取操作的标准结构比普通的锁获取操作略微复杂一些，因为需要两个try
 * 块。(如果在可中断的锁获取操作中抛出了InterruptedException,那么可以使用标准的try-
 * finally加锁模式。)在程序清单13-5中使用了lockInterruptibly 来实现程序清单13-4 中的
 * sendOnSharedLine，以便在一个可取消的任务中调用它。定时的tryLock 同样能响应中断，因
 * 此当需要实现一个定时的和可中断的锁获取操作时，可以使用tryLock方法。
 * create by yifeng
 */
public class InterruptibleLocking {
    private Lock lock = new ReentrantLock();

    public boolean sendOnSharedLine(String message) throws InterruptedException {
        lock.lockInterruptibly();
        try {
            return cancellableSendOnSharedLine(message);
        } finally {
            lock.unlock();
        }
    }

    private boolean cancellableSendOnSharedLine(String message)
        throws InterruptedException {
        // send something
        return true;
    }
}
